package com.wb3.meta.common.pojo;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.List;

@Data
public class ResultT<T> {

    private final static int ERROR_FLAG = 0; //失败标识
    private final static String ERROR_MSG = "ERROR"; //成功标识1
    public final static int SUCCESS_FLAG = 1; //成功标识
    public final static String SUCCESS_MSG = "SUCCESS"; //成功msg
    private int code;
    private T data;
    private String msg;

    public ResultT(int code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 构造返回map
     *
     * @param code
     * @param msg
     * @param data
     * @return
     */
    private static<T> ResultT<T> instance(int code, String msg, T data) {
        return new ResultT(code, msg, data);
    }

    /**
     * 默认失败方法，不带data参数
     *
     * @return
     */
    public static ResultT fail() {
        return instance(ERROR_FLAG, ERROR_MSG, null);
    }

    /**
     * 默认失败方法-增加msg传参
     *
     * @param msg
     * @return
     */
    public static <T> ResultT<T> fail(String msg) {
        return instance(ERROR_FLAG, msg, null);
    }

    /**
     * 默认失败方法，增加msg，data传参
     *
     * @param msg
     * @param data
     * @return
     */
    public static<T> ResultT<T> fail(String msg, T data) {

        return instance(ERROR_FLAG, msg, data);
    }

    /**
     * 默认失败方法，增加msg，data传参
     *
     * @param code
     * @param msg
     * @param data
     * @return
     */
    public static<T> ResultT<T> fail(int code, String msg, T data) {

        return instance(code, msg, data);
    }

    /**
     * 默认失败方法，增加msg，data传参
     *
     * @param code
     * @param msg
     * @return
     */
    public static<T> ResultT<T> fail(int code, String msg) {

        return instance(code, msg, null);
    }

    /**
     * 默认失败方法-增加data传参
     *
     * @param data
     * @return
     */
    public static <T> ResultT<T> fail(T data) {
        if (data == null) {
            return instance(ERROR_FLAG, ERROR_MSG, data);
        }
        if (data instanceof String) {
            return instance(ERROR_FLAG, data.toString(), null);
        }
        return instance(ERROR_FLAG, ERROR_MSG, data);
    }

    /**
     * 默认成功方法，增加msg，data传参
     *
     * @param msg
     * @param data
     * @return
     */
    public static<T> ResultT<T> success(String msg, T data) {

        return instance(SUCCESS_FLAG, msg, data);
    }

    /**
     * 默认成功方法-增加data传参
     *
     * @param data
     * @return
     */
    public static<T> ResultT<T> success(T data) {
        return instance(SUCCESS_FLAG, SUCCESS_MSG, data);
    }

    /**
     * 默认成功方法，不带data参数
     *
     * @return
     */
    public static<T> ResultT<T> success() {
        return instance(SUCCESS_FLAG, SUCCESS_MSG, null);
    }



    /**
     * 如果传递过来的data是对象，则转成json字符串
     *
     * @param data
     * @return
     */
    public static String changeObject2String(Object data) {
        String d = "";
        if (data instanceof String) {
            d = data.toString();
        } else if (data instanceof List) {
            d = JSONArray.toJSONString(data);
        } else {
            d = JSONObject.toJSONString(data);
        }
        return d;
    }
}
